拡張メソッドで使用を抑制

November 01, 2022


こちらの神記事を見ていた時 https://blog.kyubuns.dev/entry/2020/05/17/180917

ForEachAwaitAsync するつもりで ForEachAsync しないように! (RC4で対応済)

のなかで

await hoge.ToUniTaskAsyncEnumerable().ForEachAwaitAsync(async x => 
{
	await UniTask.Delay(TimeSpan.FromSeconds(1));
	Debug.Log($"Output {x}");
});

ForEachAwaitAsync 部分が ForEachAsync とかけてしまう。 しかしRC4で解決されました。

ということで、どういう挙動を差し込んだらエラーに出来るんだろうと疑問に思い調べてみましたところ、コミットを見つけたのでメモ

https://github.com/Cysharp/UniTask/commit/a52c26102bff9a53e30c1bbff3d91c0e452c3bc7

内容は以下のように、拡張メソッド記載でForEachAsyncメソッドを指定して呼び出された時、 Obsolete でエラー摘発を行い、 EditorBrowsableでそもそもコード記述中にインテリセンスとして表示させないようになっていました

/// <summary>Obsolete(Error), Use Use ForEachAwaitAsync instead.</summary>
[Obsolete("Use ForEachAwaitAsync instead.", true)]
[System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)]
public static UniTask ForEachAsync<T>(this IUniTaskAsyncEnumerable<T> source, Func<T, UniTask> action, CancellationToken cancellationToken = default)
{
    throw new NotSupportedException("Use ForEachAwaitAsync instead.");
}

/// <summary>Obsolete(Error), Use Use ForEachAwaitAsync instead.</summary>
[Obsolete("Use ForEachAwaitAsync instead.", true)]
[System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)]
public static UniTask ForEachAsync<T>(this IUniTaskAsyncEnumerable<T> source, Func<T, int, UniTask> action, CancellationToken cancellationToken = default)
{
    throw new NotSupportedException("Use ForEachAwaitAsync instead.");
}

なるほど! ということで.. まだまだ自分は言語機能の使い込みが出来てないなと